除了通知外,如果希望 Alert 觸發其他自動化行為,可以使用 Webhook 或 Kafka。兩者的差別在於:Webhook 直接推送訊息至單一個下游服務,而 Kafka 則是推送訊息至 Kafka,再由下游服務自行訂閱訊息,這樣可以解耦 Alerting 與下游服務的相依關係。
Webhook 是服務之間串接的常用方式,下游服務會提供一組 URL,只要對該 URL 發送 Request 就可以執行預先設定的任務。例如前一篇提到的 Slack 通知的方式之一就是使用 Webhook URL。
除了通訊軟體通知外,許多工具也提供 Webhook 機制。例如,CICD 常用的 Jenkins 提供 Generic Webhook Trigger;自動化服務如 IFTTT、Zapier 則能串接更多其他服務,例如操作 Google Sheet、Calendar,或是進行更進階的通訊軟體互動等。如果想要自建這種自動化服務,也可以使用開源的 n8n。
Webhook Contact Point 的設定
以 n8n 為例,可以在 Workflow 中建立 Webhook 作為起點,但要注意 Method 必須選擇 POST,因為 Grafana Alerting 的 Webhook 只能發送 POST 或 PUT Method。接著可建立一個 Slack 發送訊息的 Node,轉送 Webhook body 中的 message。認證則使用與前一篇一樣的 Bot Token 並搭配 chat:write.public
Scope。最後,可以再串上一個 reply 的 Slack Node,用於通知 Channel 內所有人。
n8n 中的 Workflow 設定:左邊為 Webhook 起點,中間是 Slack 發送訊息,右邊是 Slack 回覆訊息。
n8n Webhook Node 設定:Method 設定為 POST,可以使用 Listen for test event
來測試接收到的內容。
n8n Slack 發送訊息 Node 設定:Credential 下拉選單可以建立與 Slack App 的連結。
n8n Slack 回覆訊息 Node 設定:回覆目標根據前一個發送 Slack 訊息 Node 的 message_timestamp
來回覆。
n8n 轉發 Alerting 訊息至 Slack,並附加回覆訊息。
透過 Webhook,可以達到更多自動化的功能,使 Alerting 不再只是通知,而是能作為驅動其他行為的事件。例如,發生已有解決方案的事件時,可以透過自動化直接啟動修復行為,如重新啟動服務等。
Kafka 是一種 Message Queue,適用於事件驅動的場景。透過將事件發送至 Kafka Server 的 Topic 中,有需要的服務可以自行訂閱該 Topic,這樣可解耦上游與下游的相依關係。當上游需要更改或下游需要擴展時,只需遵循 Topic 的內容即可。
Grafana 提供 Kafka REST Proxy 作為 Contact Point,透過 Kafka REST Proxy 可以使用 HTTP 將訊息轉送至 Kafka Server 中。有需要關注 Alert 事件的服務則可以自行訂閱 Contact Point 中設定的 Topic。
搭配 Kafka REST Proxy 的 Kafka 服務架構
Kafka REST Proxy Contact Point 的設定
使用 Redpanda Console 可以查看 Kafka Server 的資訊,確認 Alerting 是否成功發送至 Kafka Server。
在 Redpanda Console 中檢視 Kafka Server 的 Topic。
在 Redpanda Console 中檢視 Topic 的訊息內容。
下游服務可以訂閱 Kafka 中的 Topic,例如印出訊息內容。
範例程式碼:https://github.com/blueswen/grafana-zero-to-hero/tree/main/06-alerting/02-trigger-event
此 Lab 會建立
啟動所有服務
docker-compose up -d
設定 Contact Point 與測試 Alert
admin/admin
Test URL
,Workflow 啟用後用的 URL 是 Production URL
,並將 n8n 提供的 URL Domain 從 localhost
改為 n8n
,在 Optional Webhook settings
將 HTTP Method
設定為 POST
http://rest-proxy:8082
,Topic 設定為 grafana-alerting
grafana-alerting
Topic 查看測試訊息關閉所有服務
docker-compose down